home *** CD-ROM | disk | FTP | other *** search
/ Aminet 19 / Aminet 19 (1997)(GTI - Schatztruhe)[!][Jun 1997].iso / Aminet / gfx / board / rtgmasdriv.lha / driver / vid_rtgm.c < prev    next >
C/C++ Source or Header  |  1997-04-19  |  32KB  |  721 lines

  1. #include <rtgmaster/rtgmaster.h>
  2. #include <pragmas/rtgmaster_pragmas.h>
  3. #include <clib/rtgmaster_protos.h>
  4. #include <rtgmaster/rtgsublibs.h>
  5. #include <proto/graphics.h>
  6. #include <intuition/screens.h>
  7. #include <graphics/modeid.h>
  8. #include <graphics/displayinfo.h>
  9. #include <exec/execbase.h>
  10. #include <exec/types.h>
  11. #include <string.h>
  12. #include <stdio.h>
  13.  
  14. /**********************************************************************
  15. *                                                                     *
  16. *                     rtgmaster game driver                           *
  17. *                     Version 1.1                                     *
  18. *                                                                     *
  19. **********************************************************************/
  20.  
  21.  
  22. #include "vid_rtgm.h"
  23.  
  24. #define NOPOINTER 0
  25. #define POINTER 1
  26. #define RTGMASTER 3
  27. #define DOUBLEBUFFER 2
  28. #define BLITTER 1
  29. #define MOVE16 0
  30.  
  31. int rtgmpointer;
  32. extern int rtgmtype;
  33. int rtgmextravram;
  34.  
  35. struct ScreenReq *sr=0;
  36. int modereq=0;
  37.  
  38. extern struct RTGMasterBase *RTGMasterBase; // Library Base of rtgmaster
  39. extern struct ExecBase *SysBase; // ExecBase
  40. extern struct RtgScreen *rtgm_scr; // The RtgScreen
  41. extern void *rtgm_backingbuf; // Backing Buf of size of Screen
  42. int pformat; // Pixelformat
  43. int numbuf;
  44.  
  45. /*****************************************************************
  46. * numbuf contains the number of allocated VRAM Buffers, this is  *
  47. * needed by SwapBuffers to handle lvid->buffer correctly.        *
  48. *****************************************************************/
  49.  
  50. int pmodetype;
  51.  
  52. /* To save the pcurrentmode->type for RTGM_Shutdown */
  53.  
  54. /*******************************************************************
  55. * This structure is also found in the latest rtgmaster/rtgmaster.h *
  56. * as RDCMPData. port should best not be used. It contains an       *
  57. * IDCMP Messageport, but this port does not work for all WB        *
  58. * Emulations. signal works for all WB Emulations, and contains the *
  59. * 1<<UserPort->SigBit. *MouseX and *MouseY are the current         *
  60. * Mousepositions (not MouseX, *MouseX, these are pointers !!!)     *
  61. * This structure does not work with rtgPICA.library up to now, and *
  62. * it needs at least rtgCGX.library V2.37 for CyberGraphX,Picasso96 *
  63. * or Probench 3, at least rtgEGS.library V2.32 for EGS.
  64. *******************************************************************/
  65.  
  66. extern struct RDCMPData *rtgport;
  67. extern void *TheMap;
  68.  
  69. /*******************************************************************
  70. * Video RAM Base Address of the Screen. This is ALWAYS the address *
  71. * of the front buffer. If you use Doublebuffering, this variable   *
  72. * will be set to the correct new value.                            *
  73. *******************************************************************/
  74.  
  75. int convert;
  76.  
  77. /******************************************************************
  78. * Is 0xd7<->'x' conversion needed ? (NOTE: This is only needed by *
  79. * CyberGraphX 2, CyberGraphX 3 has an 'x', not a 0xd7. This code  *
  80. * recognizes automatically, if conversion is needed or not.       *
  81. ******************************************************************/
  82.  
  83. extern void *extravram;
  84.  
  85. /******************************************************************
  86. * If the rtgm_extravram variable is set to 1, one extra Buffer    *
  87. * will be allocated and stored in this variable. numbuf will be   *
  88. * set to the correct value.                                       *
  89. ******************************************************************/
  90.  
  91. extern int proc_type; // Is it a 040/060 ?
  92. char BoardName[255]; // For the BoardName
  93. extern int currentbuffer; // Current buffer for Doublebuffering
  94.  
  95. UWORD clearpointer[36] = {
  96.  0x0, 0x0,
  97.  0x0, 0x0,
  98.  0x0, 0x0,
  99.  0x0, 0x0,
  100.  0x0, 0x0,
  101.  0x0, 0x0,
  102.  0x0, 0x0,
  103.  0x0, 0x0,
  104.  0x0, 0x0,
  105.  0x0, 0x0,
  106.  0x0, 0x0,
  107.  0x0, 0x0,
  108.  0x0, 0x0,
  109.  0x0, 0x0,
  110.  0x0, 0x0,
  111.  0x0, 0x0,
  112.  0x0, 0x0,
  113.  0x0, 0x0
  114.  };
  115.  
  116. extern __asm AmigaCC040(register __a0 APTR buffer,register __d0 int x,register __d1 int y,
  117.         register __d2 int rows, register __a1 APTR dest,register __d3 int w,register __d4 int h);
  118. extern __asm AmigaCC(register __a0 APTR buffer,register __d0 int x,register __d1 int y,
  119.         register __d2 int rows, register __a1 APTR dest,register __d3 int w,register __d4 int h);
  120. extern __asm MyCopy8(register __a0 APTR src,register __a1 APTR dest,register __d0 rowbytessrc,register __d1 rowbytesdest,
  121.                     register __d2 srcx,register __d3 srcy,register __d4 width,register __d5 height);
  122. extern __asm MyCopyBack8(register __a0 APTR src,register __a1 APTR dest,register __d0 rowbytessrc,register __d1 rowbytesdest,
  123.                     register __d2 destx,register __d3 desty,register __d4 width,register __d5 height);
  124. extern __asm MyCopy16(register __a0 APTR src,register __a1 APTR dest,register __d0 rowbytessrc,register __d1 rowbytesdest,
  125.                     register __d2 srcx,register __d3 srcy,register __d4 width,register __d5 height);
  126. extern __asm MyCopyBack16(register __a0 APTR src,register __a1 APTR dest,register __d0 rowbytessrc,register __d1 rowbytesdest,
  127.                     register __d2 destx,register __d3 desty,register __d4 width,register __d5 height);
  128. extern __asm MyCopy24(register __a0 APTR src,register __a1 APTR dest,register __d0 rowbytessrc,register __d1 rowbytesdest,
  129.                     register __d2 srcx,register __d3 srcy,register __d4 width,register __d5 height);
  130. extern __asm MyCopyBack24(register __a0 APTR src,register __a1 APTR dest,register __d0 rowbytessrc,register __d1 rowbytesdest,
  131.                     register __d2 destx,register __d3 desty,register __d4 width,register __d5 height);
  132. extern __asm MyCopy32(register __a0 APTR src,register __a1 APTR dest,register __d0 rowbytessrc,register __d1 rowbytesdest,
  133.                     register __d2 srcx,register __d3 srcy,register __d4 width,register __d5 height);
  134. extern __asm MyCopyBack32(register __a0 APTR src,register __a1 APTR dest,register __d0 rowbytessrc,register __d1 rowbytesdest,
  135.                     register __d2 destx,register __d3 desty,register __d4 width,register __d5 height);
  136.  
  137.  
  138. void __asm RTGM_SetPalette(register __a0 viddef_t *lvid, register __a1 vmode_t *pcurrentmode, register __a2 unsigned char *palette);
  139. struct RDCMPData __asm *RTGM_SetMode (register __a0 viddef_t *lvid, register __a1 vmode_t *pcurrentmode);
  140. void __asm RTGM_CloseMode (register __a0 viddef_t *lvid, register __a1 vmode_t *pcurrentmode);
  141. void __asm RTGM8_BeginDirectRect (register __a0 viddef_t *lvid, register __a1 struct vmode_s *pcurrentmode, register __d0 int x,register __d1 int y, register __a2 byte *pbitmap, register __d2 int width, register __d3 int height);
  142. void __asm RTGM8_EndDirectRect (register __a0 viddef_t *lvid, register __a1 struct vmode_s *pcurrentmode, register __d0 int x, register __d1 int y, register __d2 int width, register __d3 int height);
  143. void __asm RTGM8_SwapBuffers (register __a0 viddef_t *lvid, register __a1 vmode_t *pcurrentmode, register __a2 vrect_t *rects,register __d0 int wait);
  144. void __asm RTGM16_BeginDirectRect (register __a0 viddef_t *lvid, register __a1 struct vmode_s *pcurrentmode, register __d0 int x,register __d1 int y, register __a2 byte *pbitmap, register __d2 int width, register __d3 int height);
  145. void __asm RTGM16_EndDirectRect (register __a0 viddef_t *lvid, register __a1 struct vmode_s *pcurrentmode, register __d0 int x, register __d1 int y, register __d2 int width, register __d3 int height);
  146. void __asm RTGM16_SwapBuffers (register __a0 viddef_t *lvid, register __a1 vmode_t *pcurrentmode, register __a2 vrect_t *rects,register __d0 int wait);
  147. void __asm RTGM24_BeginDirectRect (register __a0 viddef_t *lvid, register __a1 struct vmode_s *pcurrentmode, register __d0 int x,register __d1 int y, register __a2 byte *pbitmap, register __d2 int width, register __d3 int height);
  148. void __asm RTGM24_EndDirectRect (register __a0 viddef_t *lvid, register __a1 struct vmode_s *pcurrentmode, register __d0 int x, register __d1 int y, register __d2 int width, register __d3 int height);
  149. void __asm RTGM24_SwapBuffers (register __a0 viddef_t *lvid, register __a1 vmode_t *pcurrentmode, register __a2 vrect_t *rects,register __d0 int wait);
  150. void __asm RTGM32_BeginDirectRect (register __a0 viddef_t *lvid, register __a1 struct vmode_s *pcurrentmode, register __d0 int x,register __d1 int y, register __a2 byte *pbitmap, register __d2 int width, register __d3 int height);
  151. void __asm RTGM32_EndDirectRect (register __a0 viddef_t *lvid, register __a1 struct vmode_s *pcurrentmode, register __d0 int x, register __d1 int y, register __d2 int width, register __d3 int height);
  152. void __asm RTGM32_SwapBuffers (register __a0 viddef_t *lvid, register __a1 vmode_t *pcurrentmode, register __a2 vrect_t *rects,register __d0 int wait);
  153.  
  154. // INPUT : pixformats - Engine supported pixformats
  155. // OUTPUT: A chained list of vmode_t structures with all the possibles screenmodes
  156. // NOTE: vmode_t structures MUST be allocated with AllocVec function
  157.  
  158. vmode_t __asm *RTGM_Init(register __d0 int pixformats,register __d1 int type, register __d2 int pointer, register __d3 int extra, register __a0 struct MyMode *mymode)
  159. {
  160.  int width,height;
  161.  vmode_t *video,*oldvideo=NULL,*firstvideo=NULL;
  162.  struct RtgLibs *SubLib;
  163.  struct ScreenMode *SMList;
  164.  char *q;
  165.  
  166.  // First open rtgmaster.library of at least V14.
  167.  
  168.  rtgmtype=type;
  169.  rtgmpointer=pointer;
  170.  rtgmextravram=extra;
  171.  currentbuffer=0;
  172.  proc_type=0;
  173.  RTGMasterBase = (struct RTGMasterBase *)OpenLibrary("rtgmaster.library",14);
  174.  
  175.  pformat=pixformats;
  176.  modereq=0;
  177.  if (RTGMasterBase)
  178.  {
  179.  
  180.   // Get the List of Screenmodes
  181.  
  182.   SubLib=RTGMasterBase->Libraries;
  183.   SMList=SubLib->SMList;
  184.   while (strstr(SMList->Name,"TestScreen")) SMList=(struct ScreenMode *)(SMList->ScrNode).mln_Succ;
  185.   while((SMList->ScrNode).mln_Succ!=0)
  186.   {
  187.    // As long as there is still a valid screenmode
  188.  
  189.    SMList=(struct ScreenMode *)(SMList->ScrNode).mln_Succ;
  190.    if (((SMList->ChunkySupport&4)&&(pixformats&RGB16))||((SMList->ChunkySupport&32)&&(pixformats&BGR24))||((SMList->ChunkySupport&2)&&(pixformats&RGB24))||((SMList->ChunkySupport&256)&&(pixformats&RGBA32))||((SMList->ChunkySupport&32768)&&(pixformats&&BGRA32))||((SMList->ChunkySupport&1)&&(pixformats&ARGB32))||((SMList->ChunkySupport&16384)&&(pixformats&BGR16PC))||((SMList->ChunkySupport&8192)&&(pixformats&RGB16PC))||((SMList->ChunkySupport&4096)&&(pixformats&BGR15PC))||((SMList->ChunkySupport&2048)&&(pixformats&RGB15PC))||((SMList->ChunkySupport&64)&&(pixformats&BGR16))||((SMList->ChunkySupport&128)&&(pixformats&BGR15))||((SMList->ChunkySupport&8)&&(pixformats&RGB15))||((SMList->ChunkySupport&512)&&(pixformats&LUT8)))
  191.    {
  192.  
  193.     // If the Screenmode supports 8 Bit (Bit 9 set) and
  194.     // if the engine supports LUT8
  195.  
  196.     // Get Width and height
  197.  
  198.     char *hilf;
  199.     width=(SMList->StandardOverscan).Width;
  200.     height=(SMList->StandardOverscan).Height;
  201.     if (!strstr(SMList->Name,"TestScreen"))
  202.     {
  203.      // Get Boardname for later Screenmode comparision...
  204.      int TrueColor;
  205.      TrueColor=0;
  206.  
  207.      strcpy(&BoardName[0],SMList->Name);
  208.      hilf=strstr(&BoardName[0],":");
  209.      hilf[0]='\0';
  210.  
  211.      // Set Maximum resolutions :
  212.      // No Maximum for 8 Bit
  213.      // 640x480 for 16 Bit
  214.      // 320x240 for 24 Bit
  215.  
  216.      if ((SMList->ChunkySupport&1)||(SMList->ChunkySupport&32768)||(SMList->ChunkySupport&256)||(SMList->ChunkySupport&2)||(SMList->ChunkySupport&32)) TrueColor=1;
  217.      if ((width>=320)&&(height>=200)&&(((width<=640)&&(height<=480))||(SMList->ChunkySupport&512))&&(((width<=320)&&(height<=240))||(!(TrueColor))))
  218.      {
  219.       // Now transform rtgmaster Screenmode format to AmigaQuake
  220.       // Screenmode Format
  221.  
  222.       if (video=AllocVec(sizeof(vmode_t),MEMF_PUBLIC|MEMF_CLEAR))
  223.       {
  224.        if (firstvideo) oldvideo->pnext=video;
  225.        else firstvideo=video;
  226.        oldvideo=video;
  227.        video->ID = SMList->ModeID;
  228.        video->width= width;
  229.        video->height= height;
  230.  
  231.        // Set rowbytes according to Screen-Depth
  232.  
  233.        if (SMList->ChunkySupport&512) video->rowbytes=video->width;
  234.        else if (SMList->ChunkySupport&1) video->rowbytes=4*(video->width);
  235.        else if (SMList->ChunkySupport&32768) video->rowbytes=4*(video->width);
  236.        else if (SMList->ChunkySupport&256) video->rowbytes=4*(video->width);
  237.        else if (SMList->ChunkySupport&2) video->rowbytes=3*(video->width);
  238.        else if (SMList->ChunkySupport&32) video->rowbytes=3*(video->width);
  239.        else video->rowbytes=2*(video->width);
  240.        video->setpalette = &RTGM_SetPalette;
  241.        video->setmode = &RTGM_SetMode;
  242.        video->closemode= &RTGM_CloseMode;
  243.  
  244.        // Set Swapbuffers function according to Screen-Depth
  245.  
  246.        if (SMList->ChunkySupport&512) video->swapbuffers = &RTGM8_SwapBuffers;
  247.        else if (SMList->ChunkySupport&1) video->swapbuffers= &RTGM32_SwapBuffers;
  248.        else if (SMList->ChunkySupport&32768) video->swapbuffers= &RTGM32_SwapBuffers;
  249.        else if (SMList->ChunkySupport&256) video->swapbuffers= &RTGM32_SwapBuffers;
  250.        else if (SMList->ChunkySupport&2) video->swapbuffers= &RTGM24_SwapBuffers;
  251.        else if (SMList->ChunkySupport&32) video->swapbuffers= &RTGM24_SwapBuffers;
  252.        else video->swapbuffers=&RTGM16_SwapBuffers;
  253.  
  254.        video->sendkeyevents=&Sys_SendKeyEvents;
  255.  
  256.        // Set BeginDirectRect Function according to Screen-Depth
  257.  
  258.        if (SMList->ChunkySupport&512) video->begindirectrect = &RTGM8_BeginDirectRect;
  259.        else if (SMList->ChunkySupport&1) video->begindirectrect= &RTGM32_BeginDirectRect;
  260.        else if (SMList->ChunkySupport&32768) video->begindirectrect= &RTGM32_BeginDirectRect;
  261.        else if (SMList->ChunkySupport&256) video->begindirectrect= &RTGM32_BeginDirectRect;
  262.        else if (SMList->ChunkySupport&2) video->begindirectrect= &RTGM24_BeginDirectRect;
  263.        else if (SMList->ChunkySupport&32) video->begindirectrect= &RTGM24_BeginDirectRect;
  264.        else video->begindirectrect=&RTGM16_BeginDirectRect;
  265.  
  266.        // Set EndDirectRect Function according to Screen-Depth
  267.  
  268.        if (SMList->ChunkySupport&512) video->enddirectrect = &RTGM8_EndDirectRect;
  269.        else if (SMList->ChunkySupport&1) video->enddirectrect= &RTGM32_EndDirectRect;
  270.        else if (SMList->ChunkySupport&32768) video->enddirectrect= &RTGM32_EndDirectRect;
  271.        else if (SMList->ChunkySupport&256) video->enddirectrect= &RTGM32_EndDirectRect;
  272.        else if (SMList->ChunkySupport&2) video->enddirectrect= &RTGM24_EndDirectRect;
  273.        else if (SMList->ChunkySupport&32) video->enddirectrect= &RTGM24_EndDirectRect;
  274.        else video->enddirectrect=&RTGM16_EndDirectRect;
  275.  
  276.        // Set video-type according to Pixelformat
  277.  
  278.        if (SMList->ChunkySupport&512) video->type=PIXFMT_LUT8;
  279.        else if (SMList->ChunkySupport&4) video->type=PIXFMT_RGB16;
  280.        else if (SMList->ChunkySupport&8) video->type=PIXFMT_RGB15;
  281.        else if (SMList->ChunkySupport&64) video->type=PIXFMT_BGR16;
  282.        else if (SMList->ChunkySupport&128) video->type=PIXFMT_BGR15;
  283.        else if (SMList->ChunkySupport&2048) video->type=PIXFMT_RGB15PC;
  284.        else if (SMList->ChunkySupport&4096) video->type=PIXFMT_BGR15PC;
  285.        else if (SMList->ChunkySupport&8192) video->type=PIXFMT_RGB16PC;
  286.        else if (SMList->ChunkySupport&16384) video->type=PIXFMT_BGR16PC;
  287.        else if (SMList->ChunkySupport&1) video->type=PIXFMT_ARGB32;
  288.        else if (SMList->ChunkySupport&32768) video->type=PIXFMT_BGRA32;
  289.        else if (SMList->ChunkySupport&256) video->type=PIXFMT_RGBA32;
  290.        else if (SMList->ChunkySupport&2) video->type=PIXFMT_RGB24;
  291.        else if (SMList->ChunkySupport&32) video->type=PIXFMT_BGR24;
  292.                         
  293.        if (rtgmtype==DOUBLEBUFFER) {
  294.                                 video->numpages=2;
  295.                                 video->direct=1;
  296.                         }
  297.        else if (rtgmtype==BLITTER) {
  298.        video->numpages=1;
  299.        video->direct=1;
  300.                         }
  301.        else  {
  302.        video->numpages=1;
  303.        video->direct=1;
  304.  
  305.                         }
  306.  
  307. /*****************************************************
  308. * This is direct draw, but only one buffer currently *
  309. * (under some WB Emulations, including CyberGraphX,  *
  310. * DBuffering is a bit flickering currently)          *
  311. *****************************************************/
  312.  
  313. // And the name of the Screenmode...
  314. // BoardName replaced with RtgMaster:
  315.  
  316.        strcpy(video->name,"RTGMaster:");
  317.        hilf=strstr(SMList->Name,":");
  318.        hilf+=2;
  319.        strcat(video->name,hilf);
  320.        hilf=video->name;
  321.        q=hilf;
  322.        convert=0;
  323.  
  324. /****************************************************************
  325. * The next lines of code convert the 0xd7 char of CyberGraphX 2 *
  326. * to an 'x'. I could not test this code, as there is no 0xd7    *
  327. * under CyberGraphX 3. Under CyberGraphX 3 the normal 'x' is    *
  328. * used. But the code should work...                             *
  329. * convert is set, if a conversion was needed. It is used by the *
  330. * SetMode function, so that Screenmodes are correctly found.    *
  331. ****************************************************************/
  332.  
  333.        while (*hilf!=0)
  334.        {
  335.         if (*hilf=='×')
  336.         {
  337.          *q++='x';
  338.          convert=1;
  339.          *hilf++;
  340.         }
  341.         else *q++=*hilf++;
  342.        }
  343.        *q++=0;
  344.       }
  345.      }
  346.     }
  347.    }
  348.   }
  349.  }
  350.  if (mymode)
  351.  {
  352.   struct TagItem rtag[] = {
  353.     smr_MinWidth,       320,
  354.     smr_MinHeight,      200,
  355.     smr_MaxWidth,       640,
  356.     smr_MaxHeight,      512,
  357.     smr_ChunkySupport,  512,
  358.     smr_PlanarSupport,  128,
  359.     smr_ProgramUsesC2P, 0,
  360.     TAG_DONE,           NULL
  361.   };
  362.  
  363.   char  *hilf;
  364.  
  365.   modereq=1;
  366.   rtag[0].ti_Data=mymode->minwidth;
  367.   rtag[1].ti_Data=mymode->minheight;
  368.   rtag[2].ti_Data=mymode->maxwidth;
  369.   rtag[3].ti_Data=mymode->maxheight;
  370.   rtag[4].ti_Data=mymode->support;
  371.   sr=RtgScreenModeReq(rtag);
  372.   width=sr->Width;
  373.   height=sr->Height;
  374.   if (((sr->ScreenMode)->ChunkySupport)==0) return(0);
  375.   video=firstvideo;
  376.   {
  377.    SMList=sr->ScreenMode;
  378.    video->ID = SMList->ModeID;
  379.    video->width= width;
  380.    video->height= height;
  381.  
  382.    // Set rowbytes according to Screen-Depth
  383.  
  384.    width=(SMList->StandardOverscan).Width;
  385.    if (SMList->ChunkySupport&512) video->rowbytes=width;
  386.    else if (SMList->ChunkySupport&1) video->rowbytes=4*(width);
  387.    else if (SMList->ChunkySupport&32768) video->rowbytes=4*(width);
  388.    else if (SMList->ChunkySupport&256) video->rowbytes=4*(width);
  389.    else if (SMList->ChunkySupport&2) video->rowbytes=3*(width);
  390.    else if (SMList->ChunkySupport&32) video->rowbytes=3*(width);
  391.    else video->rowbytes=2*(width);
  392.    video->setpalette = &RTGM_SetPalette;
  393.    video->setmode = &RTGM_SetMode;
  394.    video->closemode= &RTGM_CloseMode;
  395.  
  396.    // Set Swapbuffers function according to Screen-Depth
  397.  
  398.    if (SMList->ChunkySupport&512) video->swapbuffers = &RTGM8_SwapBuffers;
  399.    else if (SMList->ChunkySupport&1) video->swapbuffers= &RTGM32_SwapBuffers;
  400.    else if (SMList->ChunkySupport&32768) video->swapbuffers= &RTGM32_SwapBuffers;
  401.    else if (SMList->ChunkySupport&256) video->swapbuffers= &RTGM32_SwapBuffers;
  402.    else if (SMList->ChunkySupport&2) video->swapbuffers= &RTGM24_SwapBuffers;
  403.    else if (SMList->ChunkySupport&32) video->swapbuffers= &RTGM24_SwapBuffers;
  404.    else video->swapbuffers=&RTGM16_SwapBuffers;
  405.    video->sendkeyevents=&Sys_SendKeyEvents;
  406.  
  407.    // Set BeginDirectRect Function according to Screen-Depth
  408.  
  409.    if (SMList->ChunkySupport&512)
  410.    {
  411.     video->begindirectrect = &RTGM8_BeginDirectRect;
  412.    }
  413.    else if (SMList->ChunkySupport&1) video->begindirectrect= &RTGM32_BeginDirectRect;
  414.    else if (SMList->ChunkySupport&32768) video->begindirectrect= &RTGM32_BeginDirectRect;
  415.    else if (SMList->ChunkySupport&256) video->begindirectrect= &RTGM32_BeginDirectRect;
  416.    else if (SMList->ChunkySupport&2) video->begindirectrect= &RTGM24_BeginDirectRect;
  417.    else if (SMList->ChunkySupport&32) video->begindirectrect= &RTGM24_BeginDirectRect;
  418.    else video->begindirectrect=&RTGM16_BeginDirectRect;
  419.  
  420.    // Set EndDirectRect Function according to Screen-Depth
  421.  
  422.    if (SMList->ChunkySupport&512) video->enddirectrect = &RTGM8_EndDirectRect;
  423.    else if (SMList->ChunkySupport&1) video->enddirectrect= &RTGM32_EndDirectRect;
  424.    else if (SMList->ChunkySupport&32768) video->enddirectrect= &RTGM32_EndDirectRect;
  425.    else if (SMList->ChunkySupport&256) video->enddirectrect= &RTGM32_EndDirectRect;
  426.    else if (SMList->ChunkySupport&2) video->enddirectrect= &RTGM24_EndDirectRect;
  427.    else if (SMList->ChunkySupport&32) video->enddirectrect= &RTGM24_EndDirectRect;
  428.    else video->enddirectrect=&RTGM16_EndDirectRect;
  429.  
  430.    // Set video-type according to Pixelformat
  431.  
  432.    if (SMList->ChunkySupport&512) video->type=PIXFMT_LUT8;
  433.    else if (SMList->ChunkySupport&4) video->type=PIXFMT_RGB16;
  434.    else if (SMList->ChunkySupport&8) video->type=PIXFMT_RGB15;
  435.    else if (SMList->ChunkySupport&64) video->type=PIXFMT_BGR16;
  436.    else if (SMList->ChunkySupport&128) video->type=PIXFMT_BGR15;
  437.    else if (SMList->ChunkySupport&2048) video->type=PIXFMT_RGB15PC;
  438.    else if (SMList->ChunkySupport&4096) video->type=PIXFMT_BGR15PC;
  439.    else if (SMList->ChunkySupport&8192) video->type=PIXFMT_RGB16PC;
  440.    else if (SMList->ChunkySupport&16384) video->type=PIXFMT_BGR16PC;
  441.    else if (SMList->ChunkySupport&1) video->type=PIXFMT_ARGB32;
  442.    else if (SMList->ChunkySupport&32768) video->type=PIXFMT_BGRA32;
  443.    else if (SMList->ChunkySupport&256) video->type=PIXFMT_RGBA32;
  444.    else if (SMList->ChunkySupport&2) video->type=PIXFMT_RGB24;
  445.    else if (SMList->ChunkySupport&32) video->type=PIXFMT_BGR24;
  446.  
  447.    if (rtgmtype==DOUBLEBUFFER) {
  448.                                 video->numpages=2;
  449.                                 video->direct=1;
  450.                         }
  451.    else if (rtgmtype==BLITTER) {
  452.    video->numpages=1;
  453.    video->direct=1;
  454.                         }
  455.    else  {
  456.    video->numpages=1;
  457.    video->direct=1;
  458.  
  459.                         }
  460.  
  461. /*****************************************************
  462. * This is direct draw, but only one buffer currently *
  463. * (under some WB Emulations, including CyberGraphX,  *
  464. * DBuffering is a bit flickering currently)          *
  465. *****************************************************/
  466.  
  467. // And the name of the Screenmode...
  468. // BoardName replaced with RtgMaster:
  469.  
  470.    strcpy(video->name,"RTGMaster:");
  471.    hilf=strstr(SMList->Name,":");
  472.    hilf+=2;
  473.    strcat(video->name,hilf);
  474.    hilf=video->name;
  475.    q=hilf;
  476.    convert=0;
  477.  
  478. /****************************************************************
  479. * The next lines of code convert the 0xd7 char of CyberGraphX 2 *
  480. * to an 'x'. I could not test this code, as there is no 0xd7    *
  481. * under CyberGraphX 3. Under CyberGraphX 3 the normal 'x' is    *
  482. * used. But the code should work...                             *
  483. * convert is set, if a conversion was needed. It is used by the *
  484. * SetMode function, so that Screenmodes are correctly found.    *
  485. ****************************************************************/
  486.  
  487.    while (*hilf!=0)
  488.    {
  489.     if (*hilf=='×')
  490.     {
  491.      *q++='x';
  492.      convert=1;
  493.      *hilf++;
  494.     }
  495.     else *q++=*hilf++;
  496.    }
  497.    *q++=0;
  498.  }
  499.  }
  500.  // Is this a 040/060 ?
  501.  
  502.  proc_type=SysBase->AttnFlags&AFF_68040;
  503.  if (!(SMList->ChunkySupport)) return(0);
  504.  else return(firstvideo);
  505. }
  506.  
  507. void __asm RTGM_SetPalette(register __a0 viddef_t *lvid, register __a1 vmode_t *pcurrentmode, register __a2 unsigned char *palette)
  508. {
  509.         // Works nearly the same like under CyberGraphX, only the
  510.         // Library function is another one...
  511.  
  512.         struct ColTable coltablex;
  513.         int x;
  514.         if (rtgm_scr) {
  515.                 coltablex.num_colors=256;
  516.                 coltablex.start_color=0;
  517.                 coltablex.pad1=0;
  518.                 coltablex.pad2=0;
  519.                 coltablex.pad3=0;
  520.                 for(x=0;x<256;x++) {
  521.                         coltablex.color[x].red=palette[x*3]<<24|palette[x*3]<<16|palette[x*3]<<8|palette[x*3];
  522.                         coltablex.color[x].green=palette[x*3+1]<<24|palette[x*3+1]<<16|palette[x*3+1]<<8|palette[x*3+1];
  523.                         coltablex.color[x].blue=palette[x*3+2]<<24|palette[x*3+2]<<16|palette[x*3+2]<<8|palette[x*3+2];
  524.                 }
  525.  
  526.                 // This is a function of rtgmaster.library...
  527.                 // Only set the Palette, if this is an 8 Bit Screen
  528.  
  529.                 if (pcurrentmode->type==PIXFMT_LUT8) LoadRGBRtg(rtgm_scr,(ULONG *)&coltablex);
  530.         }
  531. }
  532.  
  533. //INPUT : viddef_t and vmode_t structures, IDCMP with the wanted IDCMPs
  534. //OUTPUT : vidport or -1 Not Enough memory, -2 Unable to open screen, -3 Unable to open window
  535.  
  536. struct RDCMPData __asm *RTGM_SetMode (register __a0 viddef_t *lvid, register __a1 vmode_t *pcurrentmode) {
  537.  
  538.  
  539.         struct ScreenReq myscreenreq;
  540.         struct TagItem myscreentags[2]={rtg_Buffers,3,TAG_END,0};
  541.         struct TagItem grdtags[]={grd_BytesPerRow,0,TAG_END,0};
  542.  
  543.         struct ScreenMode *SMList;
  544.         struct RtgLibs *SubLib;
  545.  
  546.         numbuf=3;
  547.  
  548.         if ((rtgmextravram==0)&&((rtgmtype==DOUBLEBUFFER)||(rtgmtype==BLITTER)))
  549.          {myscreentags[0].ti_Data=2;numbuf=2;}
  550.         else if ((rtgmextravram==0)&&((rtgmtype==MOVE16)||(rtgmtype==MOVEM)||(rtgmtype==RTGMASTER)))
  551.          {myscreentags[0].ti_Data=1;numbuf=1;}
  552.         else if ((rtgmextravram==1)&&((rtgmtype==MOVE16)||(rtgmtype==MOVEM)||(rtgmtype==RTGMASTER)))
  553.          {myscreentags[0].ti_Data=2;numbuf=2;}
  554.  
  555.         /*********************************************************************
  556.         * Only the really needed VRAM Buffers will be allocated.
  557.         *********************************************************************/
  558.  
  559.  
  560.         // As we do not use the Screenmode-Requester of rtgmaster.library,
  561.         // we have to "fake" a ScreenReq Structure...
  562.  
  563.  
  564.         // Set the Screen-Depth according to the Pixelformat
  565.  
  566.         if (pcurrentmode->type==PIXFMT_LUT8) myscreenreq.Depth=8;
  567.         else if ((pcurrentmode->type==PIXFMT_ARGB32)||(pcurrentmode->type==PIXFMT_BGRA32)||(pcurrentmode->type==PIXFMT_RGBA32)||(pcurrentmode->type==PIXFMT_RGB24)||(pcurrentmode->type==PIXFMT_BGR24)) myscreenreq.Depth=24;
  568.         else myscreenreq.Depth=16;
  569.  
  570.         pmodetype=pcurrentmode->type;
  571.  
  572.         // Normally the Screenmode-Requester sets the flags, as we do not use the
  573.         // Screenmode-Requester of rtgmaster, we have to do this ourselves...
  574.  
  575.         myscreenreq.Flags=14;
  576.         myscreenreq.Overscan=0;
  577.         currentbuffer=0;
  578.  
  579.         // The Screenmode-entry of ScreenReq is a bit difficult to find
  580.         // (i identify it by name !!!)
  581.  
  582.         if (RTGMasterBase)
  583.         {
  584.          int found;
  585.          found=0;
  586.          SubLib=RTGMasterBase->Libraries;
  587.          SMList=SubLib->SMList;
  588.          while(((SMList->ScrNode).mln_Succ!=0)&&(!(found)))
  589.          {
  590.           SMList=(struct ScreenMode *)(SMList->ScrNode).mln_Succ;
  591.           if (((SMList->ChunkySupport&512)||(SMList->ChunkySupport&1)||(SMList->ChunkySupport&4)||(SMList->ChunkySupport&64)||(SMList->ChunkySupport&2048)||(SMList->ChunkySupport&128)||(SMList->ChunkySupport&4096)||(SMList->ChunkySupport&8192)||(SMList->ChunkySupport&16384)||(SMList->ChunkySupport&32768)||(SMList->ChunkySupport&256)||(SMList->ChunkySupport&2)||(SMList->ChunkySupport&32)||(SMList->ChunkySupport&8))&&((pformat&LUT8)||(pformat&ARGB32)||(pformat&BGR16)||(pformat&BGR15)||(pformat&RGB16)||(pformat&BGR24)||(pformat&RGB24)||(pformat&RGBA32)||(pformat&BGRA32)||(pformat&BGR16PC)||(pformat&RGB16PC)||(pformat&BGR15PC)||(pformat&RGB15PC)||(pformat&RGB15))&&(!strstr(SMList->Name,"TestScreen")))
  592.           {
  593.            // Replace RtgMaster: again with BoardName: and compare
  594.            // Screenmodes
  595.  
  596.            char hilf[255];
  597.            char *hilf2;
  598.            char *q;
  599.            strcpy(&hilf[0],BoardName);
  600.            hilf2=strstr(pcurrentmode->name,":");
  601.            strcat(&hilf[0],": ");
  602.            hilf2++;
  603.            strcat(&hilf[0],hilf2);
  604.  
  605.            hilf2=&hilf[0];
  606.            q=hilf2;
  607.            while (*hilf2!=0)
  608.            {
  609.             if ((*hilf2=='x')&&convert)
  610.             {
  611.              *q++='×';
  612.              *hilf2++;
  613.              // Only convert back, if conversion is needed. Conversion is
  614.              // NOT needed for CyberGraphX 3 for example. CyberGraphX 3
  615.              // already uses a "normal" 'x'.
  616.             }
  617.             else *q++=*hilf2++;
  618.            }
  619.            *q++=0;
  620.            if (!(stricmp(SMList->Name,&hilf[0])))
  621.            {
  622.             myscreenreq.ScreenMode=SMList;
  623.             myscreenreq.Width=SMList->StandardOverscan.Width;
  624.             myscreenreq.Height=SMList->StandardOverscan.Height;
  625.             found=1;
  626.            }
  627.           }
  628.          }
  629.         if (!(rtgm_scr=OpenRtgScreen(&myscreenreq,myscreentags))) return(-2);
  630.         }
  631.         if (rtgmpointer==0)
  632.                 RtgSetPointer(rtgm_scr,clearpointer,16,16,-15,-7);
  633.         // Lock it and get Video RAM Base Address
  634.         TheMap=LockRtgScreen(rtgm_scr);
  635.  
  636.         // Get a background Buffer in Video Memory
  637.         lvid->numpages=1;
  638.         if ((rtgmtype==MOVE16)||(rtgmtype==MOVEM)||(rtgmtype==RTGMASTER))
  639.         {
  640.          if (pcurrentmode->type==PIXFMT_LUT8) {lvid->buffer=AllocMem(lvid->width*lvid->height,MEMF_FAST|MEMF_CLEAR);}
  641.          else if ((pcurrentmode->type==PIXFMT_ARGB32)||(pcurrentmode->type==PIXFMT_BGRA32)||(pcurrentmode->type==PIXFMT_RGBA32)) lvid->buffer=AllocMem(lvid->width*lvid->height*4,MEMF_FAST|MEMF_CLEAR);
  642.          else if ((pcurrentmode->type==PIXFMT_RGB24)||(pcurrentmode->type==PIXFMT_BGR24)) lvid->buffer=AllocMem(lvid->width*lvid->height*3,MEMF_FAST|MEMF_CLEAR);
  643.          else lvid->buffer=AllocMem(lvid->width*lvid->height*2,MEMF_FAST|MEMF_CLEAR);
  644.         }
  645.         if (rtgmtype==DOUBLEBUFFER) {
  646.          lvid->buffer=GetBufAdr(rtgm_scr,1);
  647.          lvid->numpages=2;
  648.         }
  649.         else if (rtgmtype==BLITTER)
  650.         {
  651.          lvid->buffer=GetBufAdr(rtgm_scr,1);
  652.         }
  653.         if ((rtgmextravram==1)&&(rtgmtype!=MOVE16)&&(rtgmtype!=MOVEM)&&(rtgmtype!=RTGMASTER)) extravram=GetBufAdr(rtgm_scr,2);
  654.         else if (rtgmextravram==1) extravram=GetBufAdr(rtgm_scr,1);
  655.  
  656.         if (pcurrentmode->type==PIXFMT_LUT8) rtgm_backingbuf=AllocMem(24*24,MEMF_FAST|MEMF_CLEAR);
  657.         else if ((pcurrentmode->type==PIXFMT_RGB24)||(pcurrentmode->type==PIXFMT_BGR24)) rtgm_backingbuf=AllocMem(24*24*3,MEMF_FAST|MEMF_CLEAR);
  658.         else if ((pcurrentmode->type==PIXFMT_ARGB32)||(pcurrentmode->type==PIXFMT_BGRA32)||(pcurrentmode->type==PIXFMT_RGBA32)) rtgm_backingbuf=AllocMem(24*24*4,MEMF_FAST|MEMF_CLEAR);
  659.         else rtgm_backingbuf=AllocMem(24*24*2,MEMF_FAST|MEMF_CLEAR);
  660.  
  661.         GetRtgScreenData(rtgm_scr,grdtags);
  662.         pcurrentmode->rowbytes=grdtags[0].ti_Data;
  663.         lvid->rowbytes=grdtags[0].ti_Data;
  664.         rtgport=RtgInitRDCMP(rtgm_scr);
  665.         return (rtgport);
  666. }
  667.  
  668. void __asm RTGM_CloseMode (register __a0 viddef_t *lvid, register __a1 vmode_t *pcurrentmode) {
  669.  
  670.        if (rtgm_backingbuf)
  671.        {
  672.         if (pcurrentmode->type==PIXFMT_LUT8)
  673.         {
  674.          FreeMem(rtgm_backingbuf,24*24);
  675.         }
  676.         else if ((pcurrentmode->type==PIXFMT_RGB24)||(pcurrentmode->type==PIXFMT_BGR24))
  677.         {
  678.          FreeMem(rtgm_backingbuf,24*24*3);
  679.         }
  680.         else if ((pcurrentmode->type==PIXFMT_ARGB32)||(pcurrentmode->type==PIXFMT_BGRA32)||(pcurrentmode->type==PIXFMT_RGBA32))
  681.         {
  682.          FreeMem(rtgm_backingbuf,24*24*4);
  683.         }
  684.         else
  685.         {
  686.          FreeMem(rtgm_backingbuf,24*24*2);
  687.         }
  688.        }
  689.        if ((lvid->buffer)&&((rtgmtype==RTGMASTER)||(rtgmtype==MOVEM)||(rtgmtype==MOVE16)))
  690.        {
  691.        if (pcurrentmode->type==PIXFMT_LUT8)
  692.         {
  693.          FreeMem(lvid->buffer,lvid->width*lvid->height);
  694.         }
  695.         else if ((pcurrentmode->type==PIXFMT_RGB24)||(pcurrentmode->type==PIXFMT_BGR24))
  696.         {
  697.          FreeMem(lvid->buffer,lvid->width*lvid->height*3);
  698.         }
  699.         else if ((pcurrentmode->type==PIXFMT_ARGB32)||(pcurrentmode->type==PIXFMT_BGRA32)||(pcurrentmode->type==PIXFMT_RGBA32))
  700.         {
  701.          FreeMem(lvid->buffer,lvid->width*lvid->height*4);
  702.         }
  703.         else
  704.         {
  705.          FreeMem(lvid->buffer,lvid->width*lvid->height*2);
  706.         }
  707.        }
  708.         if (rtgm_scr) {
  709.  
  710.                 // Unlock the Screen and Close it
  711.  
  712.                 UnlockRtgScreen(rtgm_scr);
  713.                 CloseRtgScreen(rtgm_scr);
  714.                 rtgm_scr=NULL;
  715.         }
  716.     FreeVec(pcurrentmode);
  717.     if (sr) {FreeRtgScreenModeReq(sr);sr=0;}
  718.     CloseLibrary((struct Library *)RTGMasterBase);
  719. }
  720.  
  721.